package file2;

import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;

public class FindAllStrFile {
    public static void main(String[] args) throws IOException {
        System.out.println("请输入要打开的文件目录(绝对路径or相对路径)");
        Scanner scanner=new Scanner(System.in);
        //输入要扫描的根目录路径
        String rootDirPath=scanner.next();
        //创建出相对应的File对象
        File rootDir=new File(rootDirPath);
        //判断输入的路径是否为文件目录
        if(!rootDir.isDirectory()){
            System.out.println("你输入的文件目录路径错误or不存在");
            return;
        }
        //请输入你要查找的普通文件关键词
        System.out.println("请输入你要查找的普通文件包含的关键词");
        String toFindStr=scanner.next();
        //创建一个File顺序表用于储存找到的包含关键词的File对象
        ArrayList<File> result=new ArrayList<>();

        //采用深度优先遍历的方式进行查找
        scanDir(rootDir,toFindStr,result);

        //遍历已经装满含有关键字的普通文件的result数组
        //打印满足题意的所有文件
        System.out.println("一共为您查询到："+result.size()+"条结果");
        int i=1;
        for (File file1:result) {
            System.out.println("第"+(i++)+"个文件："+file1.getCanonicalPath());

        }
    }

    public static void scanDir(File rootDir,String tofind,ArrayList result) throws FileNotFoundException {
        //列出当前目录下所有文件(包括目录和普通文件)
        File[]files=rootDir.listFiles();
        if(files==null){
            return;
        }
        //递归遍历这些文件
        for (File file:files) {
            //判断files数组元素是否仍旧为目录，如果是的话
            //那就继续遍历当前目录
            if(file.isDirectory()){
                scanDir(file,tofind,result);
            }else if(file.isFile()){
                //判断文件名或文件内容中中是否包含关键字
                check(file,tofind,result);
            }
        }
    }
    public static void check(File file,String toFind,ArrayList result) throws FileNotFoundException {
        //如果当前普通文件file文件名包含关键字则将
        //该file对象添加到result数组中
        if(file.getName().contains(toFind)){
            result.add(file);
        }else{
            //如果文件内容中也包含关键字及时文件名字中不包含关键字那也满足条件
            //将名字中不包含关键字的文件内容读出来判断是否也有关键字
            InputStream inputStream=new FileInputStream(file);
            Scanner scan1=new Scanner(inputStream);
            String strCheck="";
            while(scan1.hasNext()){
                strCheck=scan1.next();
            }
            if(strCheck.contains(toFind)){
                result.add(file);
            }

        }

    }
}
